package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.controller.user.ShoppingCartController;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
    @Autowired
    private ShoppingCartMapper shoppingCartMapper;
    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private SetmealMapper setmealMapper;
    /**
     * 添加购物车
     * (有些冗余字段 的数值可以从他给的非冗余字段去查询其他的mapper得到 然后公共字段用我们自己定义的注解)
     * 这里前端只给我们传了dishid categoryid dishflavor等 其他的我们去查表就可以了
     * @param shoppingCartDTO
     */
    @Override
    public void addCart(ShoppingCartDTO shoppingCartDTO) {
        //判断有没有加入过这个套餐/菜品(如果有number+1 走 update/ 如果没有 走insert)
        //我们构造一个实体类便于我们操作 而且这里我们缺少了一个id 在用户端中我们可以实现解析我们的id 放在我们的ThreadLocal里面
        //注意这里我们登录过后才会下发我们JWT令牌 之后访问别的接口才会携带
        //同理这个是业务接口 我们设置了 访问业务接口的时候就会解析我们的token 这样就可以把我们的id拿到放到我们的threadlocal里面(一次请求是一个线程)
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
        Long currentuserId = BaseContext.getCurrentId();
        //注意这里问题
        shoppingCart.setUserId(currentuserId);
        //注意在新增购物车中 我们只看查询到一种菜品/套餐  因为根据在新增购物车的接口中指定了请求参数 我们根据他指定的单个参数只看查询到一种/查询不到
        //这里我们的代码有问题 只能先单查我们的number
        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
        if (list != null && list.size() > 0) {
            int getnumber = shoppingCartMapper.getnumber(shoppingCart);
            //走update
            ShoppingCart cartdata = list.get(0);
            cartdata.setNumber(getnumber+1);
            shoppingCartMapper.updatenumber(cartdata);
        }else {
            //走insert(注意有的数据 如price name等前端并没有提供)然后我们就要通过dishmapper/setmealmapper来获取那些值           根据我们的接口文档？
            //而且并且如果我们添加的是菜品/套餐 我们要查询的表还是不同的
            //这里我们在表设计的时候 菜品只有菜品id 套餐只有套餐id 不像套餐菜品表(我们可以通过这个表来查询)
            //理解多表设计 这里如果我们要访问套餐中全部的id 我们怎么使用中间表来实现（接口对应的业务可以使用的mapper不固定）
            Long dishid=shoppingCart.getDishId();
            Long setmealid=shoppingCart.getSetmealId();
            if (dishid != null) {
                //菜品
                Dish dish=dishMapper.searchbyid(dishid);
                shoppingCart.setName(dish.getName());
                shoppingCart.setImage(dish.getImage());
                shoppingCart.setAmount(dish.getPrice());
                shoppingCart.setNumber(1);
                shoppingCart.setCreateTime(LocalDateTime.now());
                shoppingCartMapper.insert(shoppingCart);
            } else {
                //套餐
                Setmeal setmeal=setmealMapper.getById(setmealid);
                shoppingCart.setName(setmeal.getName());
                shoppingCart.setImage(setmeal.getImage());
                shoppingCart.setAmount(setmeal.getPrice());
                shoppingCart.setNumber(1);
                shoppingCart.setCreateTime(LocalDateTime.now());
                shoppingCartMapper.insert(shoppingCart);
            }
            //注意这里我们是封装到我们的shoppingcart对象上 我们统一insert就可以了

        }
    }

    @Override
    public List<ShoppingCart> showshoppingcart() {
        ShoppingCart shoppingCart = new ShoppingCart();
        //这里的id我们在拦截器(注意我们的webconfig配置)中获取放在threadlocal中
        shoppingCart.setUserId(BaseContext.getCurrentId());
        return shoppingCartMapper.list(shoppingCart);
    }

    /**
     * 清空对应用户的购物车
     */
    @Override
    public void cleanshoppingcart() {
        //获得本次操作的用户id(在user中就是userid 在管理端中 就是操作的对应userid)
        Long currentId = BaseContext.getCurrentId();
        shoppingCartMapper.deletebyid(currentId);
    }

    /**
     * 删除一个菜品(在购物车中)
     * @param shoppingCartdto
     */
    @Override
    public void decrease(ShoppingCartDTO shoppingCartdto) {
        //判断我们传来的是删除一个菜品还是一个套餐(这里会区分开 最多只有一个null)
        //这里就可能需要我们进行查询对应的
        //如果删过number=0就直接清空 -->对应delete
        //如果删过number!=0 就number-- -->对应update
        //这里为了和数据库交互我们必须使用实体类
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartdto, shoppingCart);
        Long userId = BaseContext.getCurrentId();
        Long dishId = shoppingCart.getDishId();
        Long setmealId = shoppingCart.getSetmealId();
        shoppingCart.setUserId(userId);
        //这里判断是菜品还是套餐
        if (dishId != null) {
            int getnumber = shoppingCartMapper.getnumber(shoppingCart);
            //这里我们判断菜品对应的number
            if (getnumber != 1) {
                shoppingCart.setNumber(getnumber-1);
                shoppingCartMapper.subnumber(shoppingCart);
            }else {
                shoppingCartMapper.deleteone(shoppingCart);
            }
        }else{
            int getnumber = shoppingCartMapper.getnumber(shoppingCart);
            if (getnumber != 1) {
                shoppingCart.setNumber(getnumber-1);
                shoppingCartMapper.subnumber(shoppingCart);
            }else {
                shoppingCartMapper.deleteone(shoppingCart);
            }
        }

    }
}
